#include <iostream>
#include <math.h>
using namespace std;
/*
重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。
⼀元运算符有⼀个参数，⼆元运算符有两个参数，⼆元运算符的左侧运算对象传给第⼀个参数，右侧运算对象传给第⼆个参数。
如果⼀个重载运算符函数是成员函数，则它的第⼀个运算对象默认传给隐式的this指针，因此运算符重载作为成员函数时，参数⽐运算对象少⼀个。
*/

class a
{
public:
    int x;

public:
    a(int x)
    {
        this->x = x;
    }
    friend double operator*(a &x, a &y);
    friend int operator~(a &x);

    int operator[](int index) //[]操作符重载
    {
        return x * index; // 返回x的值乘以index
    }

    a *operator->() //->操作符重载
    {
        return this; // 返回指向自身的指针
    }

    int operator*() //*操作符重载
    {
        return x; // 返回x的值
    }

    a& operator+=(a &y) //+=操作符重载
    {
        x -= y.x; // 将y的值加到x上
         return *this; //返回自身
    }
};
double operator*(a &x, a &y) // 重载*操作符
{
    return sqrt(x.x + y.x); // 返回x和y的平方和的平方根
}

int operator~(a &x) // 重载~操作符
{
    return 10 - x.x; // 返回10减去x的值
}

int main()
{
    a a1(100);
    a a2(200);

    cout << *a1 << " " << a1->x << " " << a1.x << endl;
    cout << a1 * a2 << " " << ~a1 << " " << a1[10] << endl;
    a1 += a2;
    cout << a1.x << endl;
    return 0;
}
